package br.com.foxinline.modelo;

import br.com.foxinline.enums.StatusProtocolo;
import br.com.foxinline.enums.TipoDesconto;
import br.com.foxinline.enums.TipoProtocolo;
import br.com.foxinline.validador.CPF;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;

/**
 *
 * @author laverson
 */
@Entity
public class Protocolo implements Serializable {

    @Id
    @SequenceGenerator(name = "seq_protocolo", sequenceName = "seq_protocolo", allocationSize = 1)
    @GeneratedValue(generator = "seq_protocolo", strategy = GenerationType.SEQUENCE)
    private Long id;

    private Integer codigo;
    
    @NotNull
    @Enumerated(EnumType.STRING)
    private TipoProtocolo tipoProtocolo;
    
    @Enumerated(EnumType.STRING)
    private StatusProtocolo statusProtocolo;
    
    @Temporal(TemporalType.DATE)
    private Date dataCadastro;

    @Temporal(TemporalType.DATE)
    private Date dataEntrega;

    private String nomeEntrega;

    @Column(length=11)
    @CPF    
    private String cpfEntrega;

    @Temporal(TemporalType.DATE)
    private Date dataProtocolo;
    
    @Temporal(TemporalType.DATE)
    private Date dataCancelamento;

    @Column(scale = 2, precision = 14)
    @DecimalMin(value = "0.00")
    private BigDecimal valorTotalCartorio;    

    @Temporal(TemporalType.DATE)
    private Date dataConversao;
    
    @NotNull
    @ManyToOne(cascade = CascadeType.MERGE)
    private Pessoa cliente;
    
    @OneToOne
    private Usuario usuario;
    
    @OneToMany(cascade = CascadeType.ALL)
    private List<ProtocoloItem> protocoloItems;
    
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Parcela> parcelas;
    
    @Column(scale = 2, precision = 14)
    @DecimalMin(value = "0.00")
    private BigDecimal valorDevolvido;

    @Column(scale = 2, precision = 14)
    @DecimalMin(value = "0.00")
    private BigDecimal valorCartorio;

    @Column(scale = 2, precision = 14)
    @DecimalMin(value = "0.00")
    private BigDecimal valorTotalFermojupi;
    
    @Enumerated(EnumType.STRING)
    private TipoDesconto tipoDesconto;

    private Double descontoPorcentagem;

    @Column(scale = 2, precision = 14)
    @DecimalMin(value = "0.00")
    private BigDecimal descontoDinheiro;

    private boolean gratuidade;
    
    private boolean ativo;

    @Column(columnDefinition="text")
    private String observacao;

    @OneToOne
    private Cartorio cartorio;
        
    private int prazo;
    
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date validade;
    
    @OneToOne
    private Protocolo owner;

    public Protocolo() {
        this.dataCadastro = new Date();
        this.ativo = true;
        this.statusProtocolo = StatusProtocolo.ABERTO;
    }

    public Protocolo(Long id, Integer codigo, TipoProtocolo tipoProtocolo, Date dataEntrega, String nomeEntrega, String cpfEntrega, Date dataProtocolo, Date dataCancelamento, BigDecimal valorTotalCartorio, Date dataConversao, Pessoa cliente, Usuario usuario, List<ProtocoloItem> protocoloItems, List<Parcela> parcelas, BigDecimal valorDevolvido, BigDecimal valorCartorio, BigDecimal valorTotalFermojupi, TipoDesconto tipoDesconto, Double descontoPorcentagem, BigDecimal descontoDinheiro, boolean gratuidade, String observacao, Cartorio cartorio, int prazo, Date validade, Protocolo owner) {
        this.id = id;
        this.codigo = codigo;
        this.tipoProtocolo = tipoProtocolo;
        this.statusProtocolo = StatusProtocolo.ABERTO;
        this.dataCadastro = new Date();
        this.dataEntrega = dataEntrega;
        this.nomeEntrega = nomeEntrega;
        this.cpfEntrega = cpfEntrega;
        this.dataProtocolo = dataProtocolo;
        this.dataCancelamento = dataCancelamento;
        this.valorTotalCartorio = valorTotalCartorio;
        this.dataConversao = dataConversao;
        this.cliente = cliente;
        this.usuario = usuario;
        this.protocoloItems = protocoloItems;
        this.parcelas = parcelas;
        this.valorDevolvido = valorDevolvido;
        this.valorCartorio = valorCartorio;
        this.valorTotalFermojupi = valorTotalFermojupi;
        this.tipoDesconto = tipoDesconto;
        this.descontoPorcentagem = descontoPorcentagem;
        this.descontoDinheiro = descontoDinheiro;
        this.gratuidade = gratuidade;
        this.ativo = true;
        this.observacao = observacao;
        this.cartorio = cartorio;
        this.prazo = prazo;
        this.validade = validade;
        this.owner = owner;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public TipoProtocolo getTipoProtocolo() {
        return tipoProtocolo;
    }

    public void setTipoProtocolo(TipoProtocolo tipoProtocolo) {
        this.tipoProtocolo = tipoProtocolo;
    }

    public StatusProtocolo getStatusProtocolo() {
        return statusProtocolo;
    }

    public void setStatusProtocolo(StatusProtocolo statusProtocolo) {
        this.statusProtocolo = statusProtocolo;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public Date getDataEntrega() {
        return dataEntrega;
    }

    public void setDataEntrega(Date dataEntrega) {
        this.dataEntrega = dataEntrega;
    }

    public String getNomeEntrega() {
        return nomeEntrega;
    }

    public void setNomeEntrega(String nomeEntrega) {
        this.nomeEntrega = nomeEntrega;
    }

    public String getCpfEntrega() {
        return cpfEntrega;
    }

    public void setCpfEntrega(String cpfEntrega) {
        this.cpfEntrega = cpfEntrega;
    }

    public Date getDataProtocolo() {
        return dataProtocolo;
    }

    public void setDataProtocolo(Date dataProtocolo) {
        this.dataProtocolo = dataProtocolo;
    }

    public Date getDataCancelamento() {
        return dataCancelamento;
    }

    public void setDataCancelamento(Date dataCancelamento) {
        this.dataCancelamento = dataCancelamento;
    }

    public BigDecimal getValorTotalCartorio() {
        return valorTotalCartorio;
    }

    public void setValorTotalCartorio(BigDecimal valorTotalCartorio) {
        this.valorTotalCartorio = valorTotalCartorio;
    }

    public Date getDataConversao() {
        return dataConversao;
    }

    public void setDataConversao(Date dataConversao) {
        this.dataConversao = dataConversao;
    }

    public Pessoa getCliente() {
        return cliente;
    }

    public void setCliente(Pessoa cliente) {
        this.cliente = cliente;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public List<ProtocoloItem> getProtocoloItems() {
        return protocoloItems;
    }

    public void setProtocoloItems(List<ProtocoloItem> protocoloItems) {
        this.protocoloItems = protocoloItems;
    }

    public List<Parcela> getParcelas() {
        return parcelas;
    }

    public void setParcelas(List<Parcela> parcelas) {
        this.parcelas = parcelas;
    }

    public BigDecimal getValorDevolvido() {
        return valorDevolvido;
    }

    public void setValorDevolvido(BigDecimal valorDevolvido) {
        this.valorDevolvido = valorDevolvido;
    }

    public BigDecimal getValorCartorio() {
        return valorCartorio;
    }

    public void setValorCartorio(BigDecimal valorCartorio) {
        this.valorCartorio = valorCartorio;
    }

    public BigDecimal getValorTotalFermojupi() {
        return valorTotalFermojupi;
    }

    public void setValorTotalFermojupi(BigDecimal valorTotalFermojupi) {
        this.valorTotalFermojupi = valorTotalFermojupi;
    }

    public TipoDesconto getTipoDesconto() {
        return tipoDesconto;
    }

    public void setTipoDesconto(TipoDesconto tipoDesconto) {
        this.tipoDesconto = tipoDesconto;
    }

    public Double getDescontoPorcentagem() {
        return descontoPorcentagem;
    }

    public void setDescontoPorcentagem(Double descontoPorcentagem) {
        this.descontoPorcentagem = descontoPorcentagem;
    }

    public BigDecimal getDescontoDinheiro() {
        return descontoDinheiro;
    }

    public void setDescontoDinheiro(BigDecimal descontoDinheiro) {
        this.descontoDinheiro = descontoDinheiro;
    }

    public boolean isGratuidade() {
        return gratuidade;
    }

    public void setGratuidade(boolean gratuidade) {
        this.gratuidade = gratuidade;
    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    public Cartorio getCartorio() {
        return cartorio;
    }

    public void setCartorio(Cartorio cartorio) {
        this.cartorio = cartorio;
    }

    public int getPrazo() {
        return prazo;
    }

    public void setPrazo(int prazo) {
        this.prazo = prazo;
    }

    public Date getValidade() {
        return validade;
    }

    public void setValidade(Date validade) {
        this.validade = validade;
    }

    public Protocolo getOwner() {
        return owner;
    }

    public void setOwner(Protocolo owner) {
        this.owner = owner;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 41 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 41 * hash + (this.codigo != null ? this.codigo.hashCode() : 0);
        hash = 41 * hash + (this.tipoProtocolo != null ? this.tipoProtocolo.hashCode() : 0);
        hash = 41 * hash + (this.statusProtocolo != null ? this.statusProtocolo.hashCode() : 0);
        hash = 41 * hash + (this.dataCadastro != null ? this.dataCadastro.hashCode() : 0);
        hash = 41 * hash + (this.dataEntrega != null ? this.dataEntrega.hashCode() : 0);
        hash = 41 * hash + (this.nomeEntrega != null ? this.nomeEntrega.hashCode() : 0);
        hash = 41 * hash + (this.cpfEntrega != null ? this.cpfEntrega.hashCode() : 0);
        hash = 41 * hash + (this.dataProtocolo != null ? this.dataProtocolo.hashCode() : 0);
        hash = 41 * hash + (this.dataCancelamento != null ? this.dataCancelamento.hashCode() : 0);
        hash = 41 * hash + (this.valorTotalCartorio != null ? this.valorTotalCartorio.hashCode() : 0);
        hash = 41 * hash + (this.dataConversao != null ? this.dataConversao.hashCode() : 0);
        hash = 41 * hash + (this.cliente != null ? this.cliente.hashCode() : 0);
        hash = 41 * hash + (this.usuario != null ? this.usuario.hashCode() : 0);
        hash = 41 * hash + (this.protocoloItems != null ? this.protocoloItems.hashCode() : 0);
        hash = 41 * hash + (this.parcelas != null ? this.parcelas.hashCode() : 0);
        hash = 41 * hash + (this.valorDevolvido != null ? this.valorDevolvido.hashCode() : 0);
        hash = 41 * hash + (this.valorCartorio != null ? this.valorCartorio.hashCode() : 0);
        hash = 41 * hash + (this.valorTotalFermojupi != null ? this.valorTotalFermojupi.hashCode() : 0);
        hash = 41 * hash + (this.tipoDesconto != null ? this.tipoDesconto.hashCode() : 0);
        hash = 41 * hash + (this.descontoPorcentagem != null ? this.descontoPorcentagem.hashCode() : 0);
        hash = 41 * hash + (this.descontoDinheiro != null ? this.descontoDinheiro.hashCode() : 0);
        hash = 41 * hash + (this.gratuidade ? 1 : 0);
        hash = 41 * hash + (this.ativo ? 1 : 0);
        hash = 41 * hash + (this.observacao != null ? this.observacao.hashCode() : 0);
        hash = 41 * hash + (this.cartorio != null ? this.cartorio.hashCode() : 0);
        hash = 41 * hash + this.prazo;
        hash = 41 * hash + (this.validade != null ? this.validade.hashCode() : 0);
        hash = 41 * hash + (this.owner != null ? this.owner.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Protocolo other = (Protocolo) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if (this.codigo != other.codigo && (this.codigo == null || !this.codigo.equals(other.codigo))) {
            return false;
        }
        if (this.tipoProtocolo != other.tipoProtocolo) {
            return false;
        }
        if (this.statusProtocolo != other.statusProtocolo) {
            return false;
        }
        if (this.dataCadastro != other.dataCadastro && (this.dataCadastro == null || !this.dataCadastro.equals(other.dataCadastro))) {
            return false;
        }
        if (this.dataEntrega != other.dataEntrega && (this.dataEntrega == null || !this.dataEntrega.equals(other.dataEntrega))) {
            return false;
        }
        if ((this.nomeEntrega == null) ? (other.nomeEntrega != null) : !this.nomeEntrega.equals(other.nomeEntrega)) {
            return false;
        }
        if ((this.cpfEntrega == null) ? (other.cpfEntrega != null) : !this.cpfEntrega.equals(other.cpfEntrega)) {
            return false;
        }
        if (this.dataProtocolo != other.dataProtocolo && (this.dataProtocolo == null || !this.dataProtocolo.equals(other.dataProtocolo))) {
            return false;
        }
        if (this.dataCancelamento != other.dataCancelamento && (this.dataCancelamento == null || !this.dataCancelamento.equals(other.dataCancelamento))) {
            return false;
        }
        if (this.valorTotalCartorio != other.valorTotalCartorio && (this.valorTotalCartorio == null || !this.valorTotalCartorio.equals(other.valorTotalCartorio))) {
            return false;
        }
        if (this.dataConversao != other.dataConversao && (this.dataConversao == null || !this.dataConversao.equals(other.dataConversao))) {
            return false;
        }
        if (this.cliente != other.cliente && (this.cliente == null || !this.cliente.equals(other.cliente))) {
            return false;
        }
        if (this.usuario != other.usuario && (this.usuario == null || !this.usuario.equals(other.usuario))) {
            return false;
        }
        if (this.protocoloItems != other.protocoloItems && (this.protocoloItems == null || !this.protocoloItems.equals(other.protocoloItems))) {
            return false;
        }
        if (this.parcelas != other.parcelas && (this.parcelas == null || !this.parcelas.equals(other.parcelas))) {
            return false;
        }
        if (this.valorDevolvido != other.valorDevolvido && (this.valorDevolvido == null || !this.valorDevolvido.equals(other.valorDevolvido))) {
            return false;
        }
        if (this.valorCartorio != other.valorCartorio && (this.valorCartorio == null || !this.valorCartorio.equals(other.valorCartorio))) {
            return false;
        }
        if (this.valorTotalFermojupi != other.valorTotalFermojupi && (this.valorTotalFermojupi == null || !this.valorTotalFermojupi.equals(other.valorTotalFermojupi))) {
            return false;
        }
        if (this.tipoDesconto != other.tipoDesconto) {
            return false;
        }
        if (this.descontoPorcentagem != other.descontoPorcentagem && (this.descontoPorcentagem == null || !this.descontoPorcentagem.equals(other.descontoPorcentagem))) {
            return false;
        }
        if (this.descontoDinheiro != other.descontoDinheiro && (this.descontoDinheiro == null || !this.descontoDinheiro.equals(other.descontoDinheiro))) {
            return false;
        }
        if (this.gratuidade != other.gratuidade) {
            return false;
        }
        if (this.ativo != other.ativo) {
            return false;
        }
        if ((this.observacao == null) ? (other.observacao != null) : !this.observacao.equals(other.observacao)) {
            return false;
        }
        if (this.cartorio != other.cartorio && (this.cartorio == null || !this.cartorio.equals(other.cartorio))) {
            return false;
        }
        if (this.prazo != other.prazo) {
            return false;
        }
        if (this.validade != other.validade && (this.validade == null || !this.validade.equals(other.validade))) {
            return false;
        }
        if (this.owner != other.owner && (this.owner == null || !this.owner.equals(other.owner))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Protocolo{" + "id=" + id + ", codigo=" + codigo + ", tipoProtocolo=" + tipoProtocolo + ", statusProtocolo=" + statusProtocolo + ", dataCadastro=" + dataCadastro + ", dataEntrega=" + dataEntrega + ", nomeEntrega=" + nomeEntrega + ", cpfEntrega=" + cpfEntrega + ", dataProtocolo=" + dataProtocolo + ", dataCancelamento=" + dataCancelamento + ", valorTotalCartorio=" + valorTotalCartorio + ", dataConversao=" + dataConversao + ", cliente=" + cliente + ", usuario=" + usuario + ", protocoloItems=" + protocoloItems + ", parcelas=" + parcelas + ", valorDevolvido=" + valorDevolvido + ", valorCartorio=" + valorCartorio + ", valorTotalFermojupi=" + valorTotalFermojupi + ", tipoDesconto=" + tipoDesconto + ", descontoPorcentagem=" + descontoPorcentagem + ", descontoDinheiro=" + descontoDinheiro + ", gratuidade=" + gratuidade + ", ativo=" + ativo + ", observacao=" + observacao + ", cartorio=" + cartorio + ", prazo=" + prazo + ", validade=" + validade + ", owner=" + owner + '}';
    }

}
